#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <cmath>

using namespace std;



int main() {
    // 8388608 = 2 << 23
    // 4503599627370496 = 2 << 52

    cout << "Checkout Float:\n";
    float f1 = 8388609.0f;
    float f2 = 8388608.0f;
    cout << " 7位有效数字:\n" << (f1 == f2 ? "True" : "False") << endl; // False
    f1 = 8388609.2f;
    f2 = 8388609.3f;
    cout << " 8位有效数字:\n" << (f1 == f2 ? "True" : "False") << endl; // True

    // 6位小数 7位有效数字
    float f1_6 = 1.000001f;
    float f2_6 = 1.000002f;
    cout << " 6位小数 7位有效数字:\n";
    cout << (f1_6 == f2_6 ? "True" : "False") << endl; // False
    f1_6 = 1.000003f;
    f2_6 = 1.000004f;
    cout << (f1_6 == f2_6 ? "True" : "False") << endl; // False

    // 7位小数 8位有效数字
    float f1_7 = 1.0000001f;
    float f2_7 = 1.0000002f;
    cout << " 7位小数 8位有效数字:\n";
    cout << (f1_7 == f2_7 ? "True" : "False") << endl; // False
    f1_7 = 1.0000003f;
    f2_7 = 1.0000004f;
    cout << (f1_7 == f2_7 ? "True" : "False") << endl; // True

    // float 精度 7位有效数字



    cout << "Checkout Double:\n";

    // 16位有效数字
    double d1 = 4503599627370496.0;
    double d2 = 4503599627370497.0;
    cout << " 16位有效数字:\n" << (d1 == d2 ? "True" : "False") << endl; // False
    // 17位有效数字
    d1 = 4503599627370497.2;
    d2 = 4503599627370497.3;
    cout << " 17位有效数字:\n" << (d1 == d2 ? "True" : "False") << endl; // True

    // 15位小数 16位有效数字
    double d1_15 = 1.000000000000001;
    double d2_15 = 1.000000000000002;
    cout << " 15位小数 16位有效数字:\n";
    cout << (d1_15 == d2_15 ? "True" : "False") << endl; // False
    d1_15 = 1.000000000000003;
    d2_15 = 1.000000000000004;
    cout << (d1_15 == d2_15 ? "True" : "False") << endl; // False

    // 16位小数 17位有效数字
    cout << " 16位小数 17位有效数字:\n";
    double d1_16 = 1.0000000000000001;
    double d2_16 = 1.0000000000000002;
    cout << (d1_16 == d2_16 ? "True" : "False") << endl; // False
    d1_15 = 1.0000000000000003;
    d2_15 = 1.0000000000000004;
    cout << (d1_16 == d2_16 ? "True" : "False") << endl; // False
    d1_15 = 1.0000000000000007;
    d2_15 = 1.0000000000000008;
    cout << (d1_16 == d2_16 ? "True" : "False") << endl; // False
    d1_15 = 1.0000000000000011;
    d2_15 = 1.0000000000000010;
    cout << (d1_16 == d2_16 ? "True" : "False") << endl; // False

    // 17位小数 18位有效数字
    cout << " 17位小数 18位有效数字:\n";
    double d1_17 = 1.00000000000000001;
    double d2_17 = 1.00000000000000002;
    cout << (d1_17 == d2_17 ? "True" : "False") << endl; // True

    // double 精度 16位有效数字

    cout << "Float 7位有效数字 Double 16位有效数字\n";

    cout << "-4.0/0 is " << -4.0 / 0 << endl << "sqrt(-9.0) is " << sqrt(-9.0) << endl;
    //system("pause");
    return 0;
}
